package com.zx.sa.controller;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import lombok.Data;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@CrossOrigin(origins = "*")
@RequestMapping("/format")
public class ChatFormatController {

    private final ChatClient chatClient;

    @Autowired
    public ChatFormatController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping("/index")
    public String index(Model model) {
        return "format";
    }

    /**
     * 文本
     */
    @RequestMapping("/chat")
    @ResponseBody
    public Topic chat(String topic) {
        // 1. 输入模版
        String inputTemplate = """
            订单号 N0.SIDBUBASIDB, 快递已经到达北京市丰台区转运中心，预计今晚9:00送达，派送员张三，联系电话15000000000
            """;

        String systemPromptTemplate = """
                你是一名物流信息提取助手，需要从输入信息中提取以下字段，并返回json格式。
                - order：订单号
                - addr：快递当前到达位置
                - time：预计到达时间
                - name:    派送员姓名
                - phone：  派送员联系方式 
                
                要求：
                - 只返回json格式的数据，不需要添加任何附件解释和额外的文本
                - 如果缺失某个字段，提给出合理的控制或者最可能的估计。
                - 时间类字段，可以使用可解析的字符串（如ISO日期时间，例如2025-01-01 19:00:00）
                """;

        return chatClient
                .prompt()
                .system(systemPromptTemplate)
                .user(inputTemplate)
                .call()
                .entity(Topic.class);
    }

    @Data
    public static class Topic {
        // 引入spring ai的 BeanOutputConverter,会读取JsonProperty 和 Description 提升结构化提取的准确度。
        @JsonProperty("order")
        @JsonPropertyDescription("订单号，全局唯一，使用NO.开头")
        private String order;

        @JsonProperty("addr")
        @JsonPropertyDescription("快递当前到达位置")
        private String addr;

        @JsonProperty("name")
        @JsonPropertyDescription("派送员姓名")
        private String name;

        @JsonProperty("phone")
        @JsonPropertyDescription("派送员联系方式")
        private String phone;

        @JsonProperty("time")
        @JsonPropertyDescription("预计到达时间，如ISO日期时间，例如2025-01-01 19:00:00")
        private String time;
    }

} 